home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 5
/
Aminet 5 - March 1995.iso
/
Aminet
/
game
/
role
/
Ang261Lib.lha
/
src
/
prayer.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-10-22
|
12KB
|
461 lines
/*
* prayer.c: code for priest spells
*
* Copyright (c) 1989 James E. Wilson, Robert A. Koeneke
*
* This software may be copied and distributed for educational, research, and
* not for profit purposes provided that this copyright and statement are
* included in all such copies.
*/
#include "constant.h"
#include "monster.h"
#include "config.h"
#include "types.h"
#include "externs.h"
/* Pray like HELL. -RAK- */
void
pray()
{
int i, j, item_val, dir;
int choice, chance, result;
register spell_type *s_ptr;
register struct misc *m_ptr;
register struct flags *f_ptr;
register inven_type *i_ptr;
free_turn_flag = TRUE;
if (py.flags.blind > 0)
msg_print("You can't see to read your prayer!");
else if (no_light())
msg_print("You have no light to read by.");
else if (py.flags.confused > 0)
msg_print("You are too confused.");
else if (class[py.misc.pclass].spell != PRIEST)
msg_print("Pray hard enough and your prayers may be answered.");
else if (inven_ctr == 0)
msg_print("But you are not carrying anything!");
else if (!find_range(TV_PRAYER_BOOK, TV_NEVER, &i, &j))
msg_print("You are not carrying any Holy Books!");
else if (get_item(&item_val, "Use which Holy Book?", i, j, 0)) {
result = cast_spell("Recite which prayer?", item_val, &choice, &chance);
if (result < 0)
msg_print("You don't know any prayers in that book.");
else if (result > 0) {
s_ptr = &magic_spell[py.misc.pclass - 1][choice];
free_turn_flag = FALSE;
if (py.flags.stun > 50)
chance += 25;
else if (py.flags.stun > 0)
chance += 15;
if (randint(100) <= chance) /* changed -CFT */
msg_print("You lost your concentration!");
else {
/* Prayers. */
switch (choice + 1) {
case 1:
(void)detect_evil();
break;
case 2:
(void)hp_player(damroll(3, 3));
if (py.flags.cut > 0) {
py.flags.cut -= 10;
if (py.flags.cut < 0)
py.flags.cut = 0;
msg_print("Your wounds heal.");
}
break;
case 3:
bless(randint(12) + 12);
break;
case 4:
(void)remove_fear();
break;
case 5:
(void)light_area(char_row, char_col,
damroll(2, (py.misc.lev / 2)), (py.misc.lev / 10) + 1);
break;
/* FIXME: hammer? */
case 6:
(void)detect_trap();
break;
case 7:
(void)detect_sdoor();
break;
case 8:
(void)slow_poison();
break;
case 9:
if (get_dir(NULL, &dir))
(void)fear_monster(dir, char_row, char_col, py.misc.lev);
break;
case 10:
teleport((int)(py.misc.lev * 3));
break;
case 11:
(void)hp_player(damroll(4, 4));
if (py.flags.cut > 0) {
py.flags.cut = (py.flags.cut / 2) - 20;
if (py.flags.cut < 0)
py.flags.cut = 0;
msg_print("Your wounds heal.");
}
break;
case 12:
bless(randint(24) + 24);
break;
case 13:
(void)sleep_monsters1(char_row, char_col);
break;
case 14:
create_food();
break;
case 15:
remove_curse();/* -CFT */
break;
case 16:
f_ptr = &py.flags;
f_ptr->resist_heat += randint(10) + 10;
f_ptr->resist_cold += randint(10) + 10;
break;
case 17:
(void)cure_poison();
break;
case 18:
if (get_dir(NULL, &dir))
fire_ball(GF_HOLY_ORB, dir, char_row, char_col,
(int)(damroll(3,6)+py.misc.lev+
(py.misc.pclass==2 ? 2 : 1)*stat_adj(A_WIS)),
(py.misc.lev<30 ? 2 : 3));
break;
case 19:
(void)hp_player(damroll(8, 4));
if (py.flags.cut > 0) {
py.flags.cut = 0;
msg_print("Your wounds heal.");
}
break;
case 20:
detect_inv2(randint(24) + 24);
break;
case 21:
(void)protect_evil();
break;
case 22:
earthquake();
break;
case 23:
map_area();
break;
case 24:
(void)hp_player(damroll(16, 4));
if (py.flags.cut > 0) {
py.flags.cut = 0;
msg_print("Your wounds heal.");
}
break;
case 25:
(void)turn_undead();
break;
case 26:
bless(randint(48) + 48);
break;
case 27:
(void)dispel_creature(UNDEAD, (int)(3 * py.misc.lev));
break;
case 28:
(void)hp_player(200);
if (py.flags.stun > 0) {
if (py.flags.stun > 50) {
py.misc.ptohit += 20;
py.misc.ptodam += 20;
} else {
py.misc.ptohit += 5;
py.misc.ptodam += 5;
}
py.flags.stun = 0;
msg_print("Your head stops stinging.");
}
if (py.flags.cut > 0) {
py.flags.cut = 0;
msg_print("You feel better.");
}
break;
case 29:
(void)dispel_creature(EVIL, (int)(3 * py.misc.lev));
break;
case 30:
warding_glyph();
break;
case 31:
(void)dispel_creature(EVIL, (int)(4 * py.misc.lev));
(void)remove_fear();
(void)cure_poison();
(void)hp_player(1000);
if (py.flags.stun > 0) {
if (py.flags.stun > 50) {
py.misc.ptohit += 20;
py.misc.ptodam += 20;
} else {
py.misc.ptohit += 5;
py.misc.ptodam += 5;
}
py.flags.stun = 0;
msg_print("Your head stops stinging.");
}
if (py.flags.cut > 0) {
py.flags.cut = 0;
msg_print("You feel better.");
}
break;
case 32:
(void)detect_monsters();
break;
case 33:
(void)detection();
break;
case 34:
(void)ident_spell();
break;
case 35: /* probing */
(void)probing();
break;
case 36: /* Clairvoyance */
wizard_light(TRUE);
break;
case 37:
(void)hp_player(damroll(8, 4));
if (py.flags.cut > 0) {
py.flags.cut = 0;
msg_print("Your wounds heal.");
}
break;
case 38:
(void)hp_player(damroll(16, 4));
if (py.flags.cut > 0) {
py.flags.cut = 0;
msg_print("Your wounds heal.");
}
break;
case 39:
(void)hp_player(2000);
if (py.flags.stun > 0) {
if (py.flags.stun > 50) {
py.misc.ptohit += 20;
py.misc.ptodam += 20;
} else {
py.misc.ptohit += 5;
py.misc.ptodam += 5;
}
py.flags.stun = 0;
msg_print("Your head stops stinging.");
}
if (py.flags.cut > 0) {
py.flags.cut = 0;
msg_print("You feel better.");
}
break;
case 40: /* restoration */
if (res_stat(A_STR))
msg_print("You feel warm all over.");
if (res_stat(A_INT))
msg_print("You have a warm feeling.");
if (res_stat(A_WIS))
msg_print("You feel your wisdom returning.");
if (res_stat(A_DEX))
msg_print("You feel less clumsy.");
if (res_stat(A_CON))
msg_print("You feel your health returning!");
if (res_stat(A_CHR))
msg_print("You feel your looks returning.");
break;
case 41: /* rememberance */
(void)restore_level();
break;
case 42: /* dispel undead */
(void)dispel_creature(UNDEAD, (int)(4 * py.misc.lev));
break;
case 43: /* dispel evil */
(void)dispel_creature(EVIL, (int)(4 * py.misc.lev));
break;
case 44: /* banishment */
if (banish_creature(EVIL, 100))
msg_print("The Power of your god banishes the creatures!");
break;
case 45: /* word of destruction */
destroy_area(char_row, char_col);
break;
case 46: /* annihilation */
if (get_dir(NULL, &dir))
drain_life(dir, char_row, char_col, 200);
break;
case 47: /* unbarring ways */
(void)td_destroy();
break;
case 48: /* recharging */
(void)recharge(15);
break;
case 49: /* dispel curse */
(void)remove_all_curse();
break;
case 50: /* enchant weapon */
i_ptr = &inventory[INVEN_WIELD];
if (i_ptr->tval != TV_NOTHING) {
char tmp_str[100], out_val[100];
objdes(tmp_str, i_ptr, FALSE);
sprintf(out_val, "Your %s glows brightly!", tmp_str);
msg_print(out_val);
if (!enchant(i_ptr, randint(4), ENCH_TOHIT|ENCH_TODAM))
msg_print("The enchantment fails.");
}
break;
case 51: /* enchant armor */
if (1) {
int k = 0;
int l = 0;
int tmp[100];
if (inventory[INVEN_BODY].tval != TV_NOTHING)
tmp[k++] = INVEN_BODY;
if (inventory[INVEN_ARM].tval != TV_NOTHING)
tmp[k++] = INVEN_ARM;
if (inventory[INVEN_OUTER].tval != TV_NOTHING)
tmp[k++] = INVEN_OUTER;
if (inventory[INVEN_HANDS].tval != TV_NOTHING)
tmp[k++] = INVEN_HANDS;
if (inventory[INVEN_HEAD].tval != TV_NOTHING)
tmp[k++] = INVEN_HEAD;
/* also enchant boots */
if (inventory[INVEN_FEET].tval != TV_NOTHING)
tmp[k++] = INVEN_FEET;
if (k > 0)
l = tmp[randint(k) - 1];
if (TR_CURSED & inventory[INVEN_BODY].flags)
l = INVEN_BODY;
else if (TR_CURSED & inventory[INVEN_ARM].flags)
l = INVEN_ARM;
else if (TR_CURSED & inventory[INVEN_OUTER].flags)
l = INVEN_OUTER;
else if (TR_CURSED & inventory[INVEN_HEAD].flags)
l = INVEN_HEAD;
else if (TR_CURSED & inventory[INVEN_HANDS].flags)
l = INVEN_HANDS;
else if (TR_CURSED & inventory[INVEN_FEET].flags)
l = INVEN_FEET;
if (l > 0) {
char out_val[100], tmp_str[100];
i_ptr = &inventory[l];
objdes(tmp_str, i_ptr, FALSE);
sprintf(out_val, "Your %s glows faintly!", tmp_str);
msg_print(out_val);
if (!enchant(i_ptr, randint(3)+1, ENCH_TOAC))
msg_print("The enchantment fails.");
}
}
break;
case 52: /* Elemental brand */
i_ptr = &inventory[INVEN_WIELD];
if (i_ptr->tval != TV_NOTHING &&
i_ptr->name2 == SN_NULL &&
!(i_ptr->flags & TR_CURSED)) {
/* you can't create an ego weapon from a cursed object...
* the curse would "taint" the magic -CFT
*/
int hot = randint(2)-1;
char tmp_str[100], out_val[100];
objdes(tmp_str, i_ptr, FALSE);
if (hot) {
sprintf(out_val,
"Your %s is covered in a fiery shield!",
tmp_str);
i_ptr->name2 |= SN_FT;
i_ptr->flags |= (TR_FLAME_TONGUE | TR_RES_FIRE);
} else {
sprintf(out_val, "Your %s glows deep, icy blue!",
tmp_str);
i_ptr->name2 |= SN_FB;
i_ptr->flags |= (TR_FROST_BRAND | TR_RES_COLD);
}
msg_print(out_val);
enchant(i_ptr, 3+randint(3), ENCH_TOHIT|ENCH_TODAM);
calc_bonuses();
} else {
msg_print("The Branding fails.");
}
break;
case 53: /* blink */
teleport(10);
break;
case 54: /* teleport */
teleport((int)(py.misc.lev * 8));
break;
case 55: /* teleport away */
if (get_dir(NULL, &dir))
(void)teleport_monster(dir, char_row, char_col);
break;
case 56: /* teleport level */
(void)tele_level();
break;
case 57: /* word of recall */
if (py.flags.word_recall == 0) {
py.flags.word_recall = 15 + randint(20);
msg_print("The air about you becomes charged...");
} else {
py.flags.word_recall = 0;
msg_print("A tension leaves the air around you...");
}
break;
case 58: /* alter reality */
new_level_flag = TRUE;
break;
default:
break;
}
/* End of prayers. */
if (!free_turn_flag) {
m_ptr = &py.misc;
if (choice < 32) {
if ((spell_worked & (1L << choice)) == 0) {
m_ptr->exp += s_ptr->sexp << 2;
spell_worked |= (1L << choice);
prt_experience();
}
} else {
if ((spell_worked2 & (1L << (choice - 32))) == 0) {
m_ptr->exp += s_ptr->sexp << 2;
spell_worked2 |= (1L << (choice - 32));
prt_experience();
}
}
}
}
m_ptr = &py.misc;
if (!free_turn_flag) {
if (s_ptr->smana > m_ptr->cmana) {
msg_print("You faint from fatigue!");
py.flags.paralysis =
randint((int)(5 * (s_ptr->smana - m_ptr->cmana)));
m_ptr->cmana = 0;
m_ptr->cmana_frac = 0;
if (randint(3) == 1) {
msg_print("You have damaged your health!");
(void)dec_stat(A_CON);
}
} else
m_ptr->cmana -= s_ptr->smana;
prt_cmana();
}
}
}
}